package br.edu.fa7.especializao.extremeprograming.tuita.util;

import java.io.FileInputStream;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;

public class DBUnitUtil {

	private DataSource dataSource;
	private String dataSetCargaBanco;
	private String dataSetEsperado;
	private String tabela;
	private String[] colunasFiltroIncluir;
	private String[] colunasFiltroExcluir;

	public DBUnitUtil() {
		
	}

	public IDatabaseConnection getConnection() throws Exception {
		return new DatabaseConnection(getDataSource().getConnection());
	}
	
	private IDataSet getDataSet(String nomeDataSet) throws Exception {
		FileInputStream dataSetFile = new FileInputStream(
				"src/test/resources/dataset/" + nomeDataSet);
		IDataSet dataSet = new FlatXmlDataSetBuilder().build(dataSetFile);
		
		return dataSet;
	}
	
	public ITable carregaTabelaBanco()
			throws SQLException, Exception, DataSetException {
		IDataSet dataSetBanco = getConnection().createDataSet();
		
		ITable tabelaBanco = dataSetBanco.getTable(getTabela());
		ITable tabelaBancoFiltrada = DefaultColumnFilter.excludedColumnsTable(
				tabelaBanco, getColunasFiltroExcluir());
		return tabelaBancoFiltrada;
	}
	
	
	public ITable carregaTabelaEsperada() throws Exception {
		
		IDataSet dataSetEsperado = getDataSetEsperado();
		
		ITable tabelaEsperada = dataSetEsperado.getTable(getTabela());
		ITable tabelaEsperadaFiltrada = DefaultColumnFilter
				.excludedColumnsTable(tabelaEsperada, getColunasFiltroExcluir());
		return tabelaEsperadaFiltrada;
	}
	
	public IDataSet getDataSetEsperado() throws Exception {
		return getDataSet(dataSetEsperado);
	}
	
	public IDataSet getDataSetCargaBanco() throws Exception {
		return getDataSet(dataSetCargaBanco);
	}
	
	/**
	 * Gets e Sets...
	 * @return
	 */
	
	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public void setDataSetCargaBanco(String dataSetCargaBanco) {
		this.dataSetCargaBanco = dataSetCargaBanco;
	}

	public void setDataSetEsperado(String dataSetEsperado) {
		this.dataSetEsperado = dataSetEsperado;
	}

	public String getTabela() {
		return tabela;
	}

	public void setTabela(String tabela) {
		this.tabela = tabela;
	}

	public String[] getColunasFiltroIncluir() {
		return colunasFiltroIncluir;
	}

	public void setColunasFiltroIncluir(String[] colunasFiltroIncluir) {
		this.colunasFiltroIncluir = colunasFiltroIncluir;
	}

	public String[] getColunasFiltroExcluir() {
		return colunasFiltroExcluir;
	}

	public void setColunasFiltroExcluir(String[] colunasFiltroExcluir) {
		this.colunasFiltroExcluir = colunasFiltroExcluir;
	}


}